#include <vector>
#include <unordered_map>
#include <algorithm>


using namespace std;

// class Solution {
// public:
//     int subarraySum(vector<int>& nums, int k) {
//         unordered_map<int,int> um;
//         int n = nums.size();

//         for (int i = 0; i < n; i++) 
//         {
//             int sum = 0; // 存储从i到j的子数组和
//             for (int j = i; j < n; j++) 
//             {
//                 sum += nums[j]; // 累加计算子数组和（关键修正）
//                 um[sum]++; // 统计该子数组和的出现次数
//             }
//         }
//         return um[k];
//     }
// };


class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int result = 0;
        int prefix_sum = 0; //前缀和
        int n = nums.size();
        unordered_map<int, int> map;
        map[0] = 1;// 初始化：前缀和为0的出现次数为1（对应i=0的情况） 
        //对应没有数的情况 也就是为空的情况为空就没有和也就0 所以0这个的值初始化为1
        for(int i = 0; i < n; i++) 
        {
            prefix_sum += nums[i];
             // 找是否存在前缀和等于 prefix_sum - k，存在则累加次数
            if (map.count(prefix_sum - k)) {
                result += map[prefix_sum - k];
            }
            map[prefix_sum]++;
        }
        return result;
    }
};
  